SQL Server - Acesso a Bases de dados
A conexão com o banco de dados envolve diversos componentes em diferentes níveis hierárquicos e seu uso e declaração
segue uma metodologia de acesso.
1-Mecanismo(Engine) de Conexão com o Banco de dados
Dependendo da fonte de dados devemos utilizar o mecanismo de acesso a fonte específico para a fonte de dados.
Para o Microsoft Access o engine é o OLEDB :
Imports System.Data.OleDb 'acesso ao access
Para bases de dados não nativas da Microsoft existe um componente feito pelo fabricante que garante a conexão com o banco de dados.
Para o Microsoft SQL Server é o sqlclient: Imports System.Data.SqlClient
2-Conexão
Este tópico é um dos mais conturbados pois depende da fonte de dados para definir o tipo de conexão desejada bem como a string de conexão que contém os parâmetros de conexão para a fonte de dados desejada.
Toda a conexão tem os seguintes parâmetros:
1.1-Servidor ou fonte de dados
1.2-Base de dados
1.3-Usuário
1.4-Senha
1.5-Tipo de autenticação: Integrada ( com Windows) ou não.
Nota: Nem todos parâmetros acima são utilizados ao mesmo tempo em todos os tipos de conexão possíveis.
Para conectar via aplicações web com o ms sql server o string de conexão seria:
cnstr = "Data Source = " + srvt + ";Initial Catalog=" + bdt + "; User ID=" + usut + "; Password=" + senhat
Para conectar a uma base de dados access teríamos o seguinte string de conexão:
Dim cnstr As String = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=pasta\arquivo.mdb"
Note que no Access a segurança é obrigatoriamente integrada com o Windows e local.
Componentes de acesso aos dados
DataAdapter
DataAdapter é utilizado para obter as informações da fonte de dados e preencher um DataTable com os dados e constraints recebidos dentro do DataSet.
Como o próprio nome diz, um adaptador entre os dois objetos.
•Armazena :
•O objeto conexão de conexão com os dados.
•O objeto comando com os comandos a serem enviados para a fonte de dados.
•Trabalha em conjunto com o DataSet.
•É utilizado para enviar as mudanças feitas no DataSet de volta
para a fonte de dados.
• 'Traz' todos os registros de dados da fonte de dados para um 'buffer' em memória e por isso consegue manter a informação mesmo depois da conexão com a fonte de dados ter terminado.
•Simplesmente isola e faz uma ponte entre a fonte de dados do Dataset.
•Tem os seguintes comandos:
SelectCommand
InsertCommand
DeleteCommand
UpdateCommand
A diferença entre o DataAdapter e o DataReader é que o DataReader utiliza a conexão para conectar diretamente com o banco de dados sem a utilização do DataAdapter.
Data Reader
Para exibir o resultado de uma pesquisa feita num banco de dados, nada mais simples que usar os controles GridView e
DataGridView. No entanto, onde esses controles devem ser utilizados é bem diferente.
GridView é utilizado em ASP NET
DataGridView é utilizado em Windows Forms
E as diferenças não param por aí.
•O GridView funciona com o DataReader mas o DataGridView não.
•Para exibir o resultado da pesquisa em Windows Forms deve-se utilizar o DataAdapter com o controle DataGridView.
Resumindo:
aplicações web : GridView e DataReader.
WINDOWS FORMS : DataGridView e e DataAdapter.
•Características DataReader :
•1-Fechando a conexão, o DataReader é esvaziado.
•2-O acesso aos dados do DataReader é Read-Only e forward-only.
•3-Utilizando o DataReader a aplicação ganha em performance e reduz o consumo de
recursos quando armazena todos os dados de uma vez.
•4-O DataReader lê registro por registro do banco de dados, economiza recursos mas onera
a rede e a conexão tem que ficar aberta durante toda a transferência.
•5-Como o DataReader pode ler informações de diversas fontes de dados, ou seja, pode armazenar diversas 'DataTables' é por isso que associando um DataGridView diretamente nenhum dado é exibido porque o DataGridView não sabe de qual 'Data Table' deve exibir as informações.
Portanto, antes de um DataReader popular um DataGridView ele tem que ser movido para um 'DataTable'
Utilizar o DataReader ou o DataSet? :
Depende do processo.
O DataReader é bom quando se faz poucos acessos, com poucos usuários e com poucos dados trocados entre o servidor e o cliente.
Já se a pesquisa é feita com frequência e o número de usuários é maior, utilizar o DataSet.
Exemplo Windows.forms do preenchimento de um DataGridView com dados de uma tabela Access :
Imports System.Data.OleDb 'Access
Dim sql As String
Dim dt As New DataTable
sql = "select * from 001_Grupos"
dr = RetornaDataReaderACCESS(sql)
dt.Load(dr) '(*1)
DataGridView1.DataSource = dt
DataGridView1.Refresh()
*1: O DataReader não pode ser associado diretamente a um GridView.
Precisamos transferir os dados do DataReader para um DataTable e aí sim associar o DataTable ao GridView.
Public Function RetornaDataReaderACCESS(ByVal sql As String) As OleDbDataReader
Try
Dim sqlcon = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\xxx\yyy.MDB;Jet OLEDB:Database Password=senha;") '<>
sqlcon.Open()
Dim comando = New OleDbCommand(sql, sqlcon) '<>
Dim retornaQuery As OleDbDataReader = comando.ExecuteReader()
Return retornaQuery
'sqlcon.Close() se fechar a conexão antes do return perde os
dados
Catch ex As Exception
Throw ex
End Try
End Function
Exemplo web.foms do DataReader com o MS SQL executando uma querie qualquer:
Imports System.Data.SqlClient 'Acesso ao MS SQL
Public Function RetornaDataReaderMSSQL(ByVal sql As String) As SqlDataReader
Try
Dim sqlcon = New SqlConnection("Server=srv01; Database=DB_Controlexyz; UID=sa;PWD=xxx")
Dim comando = New SqlCommand(sql, sqlcon)
Dim retornaQuery As SqlDataReader = comando.ExecuteReader()
sqlcon.Close()
Return retornaQuery
Catch ex As SqlException
Throw ex
End Try
End Function
Exemplo do DataReader chamando um SP e populando um DataReader da maneira tradicional :
'chamando uma sp modo tradicional
Public Function ObtemAutor(ByVal IDAutor As String) As SqlDataReader
Dim sql As String
Dim sqlcon = New SqlConnection("Server=srv01; Database=DB_Controlexyz; UID=sa;PWD=xxx")
sql = "select nome from tb_autores where id=" + IDAutor
Dim command As SqlCommand = New SqlCommand(sql, sqlcon)
command.CommandType = CommandType.StoredProcedure
command.Parameters.Add(New SqlParameter("@IDAutor", IDAutor))
command.Connection.Open()
Return command.ExecuteReader(CommandBehavior.CloseConnection)
End Function
Exemplo do DataReader chamando um SP e populando um DataReader da maneira simplificada:
'chamando uma sp no modo simplificado
Public Function ObtemAutor2(ByVal IDAutor As String) As SqlDataReader
Dim sql As String
Dim sqlcon = New SqlConnection("Server=srv01; Database=DB_Controlexyz; UID=sa;PWD=xxx")
sql = "exec sp_pega_autor " + IDAutor
Dim command As SqlCommand = New SqlCommand(sql, sqlcon)
command.Connection.Open()
Return command.ExecuteReader(CommandBehavior.CloseConnection)
End Function